package com.eupmt.lab3.persistence.ibatis.dao;

import com.eupmt.lab3.domain.Producte;
import com.eupmt.lab3.exceptions.DistribuidorJaExisteixException;
import com.eupmt.lab3.persistence.ibatis.PersistenceManager;
import com.eupmt.lab3.persistence.ibatis.dao.ibator.IbatorDistribuidorDAOImpl;
import com.eupmt.lab3.domain.Distribuidor;
import com.eupmt.lab3.utils.Log;
import static com.eupmt.lab3.utils.Constants.*;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Aarón
 */
public class DistribuidorDAOImpl extends IbatorDistribuidorDAOImpl implements DistribuidorDAO {

    //Atributs
    private SqlMapClient sqlMapClient;
    private Log log = null;

    //Constructors
    public DistribuidorDAOImpl() {
        super();
        sqlMapClient = PersistenceManager.getInstance().getSqlMapClient();
        log = new Log();
    }

    public Distribuidor getDistribuidorById(int idDistribuidor) throws Exception {
        Distribuidor distribuidor = new Distribuidor();
        distribuidor.setIddistribuidor(idDistribuidor);

        Distribuidor distribuidorPersistence = null;
        try {
            distribuidorPersistence = (Distribuidor) sqlMapClient.queryForObject("distribuidor.getDistribuidorById", distribuidor);
        } catch (MySQLIntegrityConstraintViolationException sqle) {
            log.infoLog("SQLErrorCode: " + sqle.getErrorCode());
        }
        return distribuidorPersistence;
    }

    public Distribuidor getDistribuidorByCif(String cif) throws Exception {
        Distribuidor distribuidor = new Distribuidor();
        distribuidor.setCif(cif);

        Distribuidor distribuidorPersistence = null;
        try {
            distribuidorPersistence = (Distribuidor) sqlMapClient.queryForObject("distribuidor.getDistribuidorByCif", distribuidor);
        } catch (MySQLIntegrityConstraintViolationException sqle) {
            log.infoLog("SQLErrorCode: " + sqle.getErrorCode());
        }
        return distribuidorPersistence;
    }

    public List<Distribuidor> getDistribuidorsLikeNom(String nom) throws Exception {
        Distribuidor distribuidor = new Distribuidor();
        distribuidor.setNom(nom);

        List<Distribuidor> distribuidorPersistence = new ArrayList<Distribuidor>();
        try {
            distribuidorPersistence = (List<Distribuidor>) sqlMapClient.queryForList("distribuidor.getDistribuidorsLikeNom", distribuidor);
        } catch (MySQLIntegrityConstraintViolationException sqle) {
            log.infoLog("SQLErrorCode: " + sqle.getErrorCode());
        }
        return distribuidorPersistence;
    }

    public Distribuidor getDistribuidorByProducte(Producte producte) throws Exception {

        int idDistribuidor = producte.getIddistribuidor();

        Distribuidor distribuidor = new Distribuidor();
        distribuidor.setIddistribuidor(idDistribuidor);

        Distribuidor distribuidorPersistence = null;
        try {
           log.infoLog("iddistribuidor del producte: "+ distribuidor.getIddistribuidor());
            distribuidorPersistence = (Distribuidor) sqlMapClient.queryForObject("distribuidor.getDistribuidorById", distribuidor);
            log.infoLog("Distribuidor retornat: " + distribuidorPersistence.toString());
        } catch (MySQLIntegrityConstraintViolationException sqle) {
            log.infoLog("SQLErrorCode: " + sqle.getErrorCode());
        }
        return distribuidorPersistence;
    }

    public void saveDistribuidor(Distribuidor d) throws Exception {
        log.infoLog("Distribuidor a fer save: " + d.getIddistribuidor());

        if (d.getIddistribuidor() == UNDEFINED) {
            insertDistribuidor(d);
        } else {
            updateDistribuidor(d);
        }
    }

    public void insertDistribuidor(Distribuidor distribuidor) throws Exception {

        try {
            sqlMapClient.insert("distribuidor.insert", distribuidor);
        } catch (SQLException sqle) {
            if (sqle.getErrorCode() == DISTRIBUIDOR_JA_EXISTEIX) {
                throw new DistribuidorJaExisteixException();
            }
            log.infoLog("Insert SQLErrorCode:" + sqle.getErrorCode() + ":");
        }
    }

    public void updateDistribuidor(Distribuidor distribuidor) throws Exception {
        sqlMapClient.update("distribuidor.update", distribuidor);
    }

    public void deleteDistribuidor(Distribuidor distribuidor) throws Exception {

        try {
            sqlMapClient.delete("distribuidor.delete", distribuidor);
        } catch (SQLException sqle) {
            if (sqle.getErrorCode() == DISTRIBUIDOR_NO_EXISTEIX) {
                throw new DistribuidorJaExisteixException();
            }
        }
    }
}
